package com.tom.joke.view.banner;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.viewpager.widget.ViewPager;

import com.tom.joke.R;

/**
 * Added by Tom on 2024/07/16.
 */
public class BannerView extends RelativeLayout {
    // 自定义的bannerView。轮播的ViewPager
    private BannerViewPager mBannerVp;
    private TextView mBannerDescTv;
    private LinearLayout mDotContainerView; // 点的容器。
    private View mBannerBgView;

    private BannerAdapter mAdapter; // 自定义的BannerAdapter。
    private Context mContext;
    // 选中的drawable
    private Drawable mIndicatorFocusDrawable;
    private Drawable mIndicatorNormalDrawable;

    // 6.当前所在的位置。
    private int mCurrentPosition = 0;
    // 8.自定义属性
    private int mDotGravity = 1;  // 默认在右边。
    private int mDotSize = 8;     // 点的大小
    private int mDotDistance = 8; // 点的间距
    private int mBottomColor = Color.TRANSPARENT; // 底部更改文字颜色。默认透明
    private float mWidthProportion, mHeightProportion; // 宽高比例。

    public BannerView(Context context) {
        this(context, null);
    }

    public BannerView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BannerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        // 把布局加载到View里面。
        inflate(context, R.layout.ui_banner_layout, this);

        initAttribute(attrs); // 获取自定义属性
        initView();
    }


    // 初始化自定义属性
    private void initAttribute(AttributeSet attrs) {
        TypedArray array = mContext.obtainStyledAttributes(attrs, R.styleable.BannerView);
        // 获取自定义属性。
        mDotGravity = array.getInt(R.styleable.BannerView_dotGravity, mDotGravity);
        mIndicatorFocusDrawable = array.getDrawable(R.styleable.BannerView_dotIndicatorFocus);
        if (mIndicatorFocusDrawable == null) {
            // xml中，用户未配置颜色，使用默认值。
            mIndicatorFocusDrawable = new ColorDrawable(Color.RED);
        }
        mIndicatorNormalDrawable = array.getDrawable(R.styleable.BannerView_dotIndicatorNormal);
        if (mIndicatorNormalDrawable == null) {
            mIndicatorNormalDrawable = new ColorDrawable(Color.WHITE);
        }
        mDotSize = (int) array.getDimension(R.styleable.BannerView_dotSize, dip2px(mDotSize));
        mDotDistance = (int) array.getDimension(R.styleable.BannerView_dotDistance, dip2px(mDotDistance));
        // 获取底部颜色
        mBottomColor = array.getColor(R.styleable.BannerView_bottomColor, mBottomColor);
        // 获取宽高比例。
        mWidthProportion = array.getFloat(R.styleable.BannerView_widthProportion, mWidthProportion);
        mHeightProportion = array.getFloat(R.styleable.BannerView_heightProportion, mHeightProportion);
        array.recycle();
    }

    private void initView() {
        // 初始化view。
        mBannerVp = findViewById(R.id.banner_vp);
        mBannerDescTv = findViewById(R.id.banner_desc_tv);
        mDotContainerView = findViewById(R.id.dot_container);

        mBannerBgView = findViewById(R.id.banner_bottom_view);
        mBannerBgView.setBackgroundColor(mBottomColor); // 设置背景色。
    }


    // 设置适配器，
    public void setAdapter(BannerAdapter adapter) {
        mAdapter = adapter;
        mBannerVp.setAdapter(adapter);

        // 5.初始化点的指示器。
        initDotIndicator();
        // 6.dot bug修改。
        mBannerVp.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                // 当前选中了那个点。
                pageSelected(position);
            }
        });
        // 6.3 初始化的时候，获取第一条的描述显示。
        String bannerDesc = mAdapter.getBannerDesc(0);
        mBannerDescTv.setText(bannerDesc);

        // 用户未指定图片的宽高比例, 自适应Banner高度。
        if (mHeightProportion == 0 || mWidthProportion == 0) {
            return;
        }
        // 8.动态的设置高度。不同屏幕，宽高是不同的。
        int width = getMeasuredWidth();
        int height = (int) (width * mHeightProportion / mWidthProportion);
        getLayoutParams().height = height;
    }


    // 6.页面切换回调。指示点处理（当前点高亮，之前的点变默认）
    private void pageSelected(int position) {
        // 之前的点，设置为默认。
        DotIndicatorView oldDotView = (DotIndicatorView) mDotContainerView.getChildAt(mCurrentPosition);
        oldDotView.setDrawable(mIndicatorNormalDrawable);

        mCurrentPosition = position % mAdapter.getCount();
        DotIndicatorView newDowView = (DotIndicatorView) mDotContainerView.getChildAt(mCurrentPosition);
        newDowView.setDrawable(mIndicatorFocusDrawable);

        // 设置广告位。
        String bannerDesc = mAdapter.getBannerDesc(mCurrentPosition);
        mBannerDescTv.setText(bannerDesc);
    }

    // 5.初始化点的指示器。
    private void initDotIndicator() {
        int count = mAdapter.getCount();
        mDotContainerView.setGravity(getDotGravity());
        for (int i = 0; i < count; i++) {
            // 添加圆点。
            DotIndicatorView indicatorView = new DotIndicatorView(mContext);
            // 设置dot的大小。左右间距
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mDotSize, mDotSize);
            params.leftMargin = mDotDistance;
            indicatorView.setLayoutParams(params);

            if (i == 0) { // 选中
                indicatorView.setDrawable(mIndicatorFocusDrawable);
            } else { // 未选中
                indicatorView.setDrawable(mIndicatorNormalDrawable);
            }
            mDotContainerView.addView(indicatorView);
        }
    }

    // 根据xml设置的，返回点显示位置。
    private int getDotGravity() {
        switch (mDotGravity) {
            case 0:
                return Gravity.CENTER;
            case 1:
                return Gravity.RIGHT;
            default:
                return Gravity.LEFT;
        }
    }

    private int dip2px(int dip) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dip, getResources().getDisplayMetrics());
    }

    // 4.开始轮播滚动。
    public void startRoll() {
        mBannerVp.startRoll();
    }

    /**
     * 10.设置点击回调监听
     */
    public void setOnBannerItemClickListener(BannerViewPager.BannerItemClickListener listener) {
        mBannerVp.setOnBannerItemClickListener(listener);
    }

    /**
     * 隐藏页面指示器
     */
    public void hidePageIndicator() {
        mDotContainerView.setVisibility(View.INVISIBLE);
    }

    /**
     * 显示页面指示器
     */
    public void showPageIndicator() {
        mDotContainerView.setVisibility(View.VISIBLE);
    }

}
